package com.hup.utils.swing.frame;

import lombok.extern.log4j.Log4j2;

import java.util.HashMap;

/**
 * 单例窗口实现类;
 * 初衷:
 * 解决通过[托盘菜单]打开单例窗口的问题;托盘菜单打开的窗口,即使设置了'阻塞',
 * 托盘菜单仍可在窗口前置的情况下再次激活菜单项,导致产生多窗口实例
 *
 * @author hugan
 * @date 2020/5/25
 */
@Log4j2
public class SingletonWindowHelper {

    private final static HashMap<Class<?>, BaseWindow> WINDOWS = new HashMap<>();

    /**
     * 用于获取[窗口,弹窗等]的唯一实例,防止多开
     *
     * @apiNote 注意!!在多线程操作时可能有异常,一般发生在程序启动时:
     * .主线程/ui线程, new BaseFrame.super()时,就将frame添加到本类中了!,此时实现类还没初始化完!!(没initView, initListener等)
     * .此时,使用异步线程getWindow, 会返回未初始化完的window, 可能导致空指针等异常
     * .处理方式: 实现类中加入inited标志,自行判断; 或不使用SingletonWindowHelper!
     * .不把 BaseFrame和SingletonWindowHelper写复杂, 因为本功能只是为了[防止多开]
     */
    @SuppressWarnings("unchecked")
    public static <T extends BaseWindow> T getWindow(Class<T> clz) {
        return (T) WINDOWS.get(clz);
    }

    public static void addWindow(BaseWindow baseWindow) {
        WINDOWS.put(baseWindow.getClass(), baseWindow);
    }

    public static void removeWindow(BaseWindow baseWindow) {
        WINDOWS.remove(baseWindow.getClass());
    }
}
